#include <iostream>
#include <sw/redis++/redis++.h>

#include "util.hpp"

void test1(sw::redis::Redis& redis)
{
    std::cout << "zadd 和 zrange" << std::endl;
    redis.flushall();

    redis.zadd("key", "吕布", 100);

    redis.zadd("key", {
        std::make_pair("赵云", 99.5),
        std::make_pair("关羽", 98.0)
    });

    std::vector<std::pair<std::string, double>> pairs = {
        {"张飞", 97}, {"典韦", 96.5}
    };
    redis.zadd("key", pairs.begin(), pairs.end());

    std::vector<std::pair<std::string, double>> resultsWithScore;
    auto it1 = std::back_inserter(resultsWithScore);
    redis.zrange("key", 0, -1, it1);
    printContainerPair(resultsWithScore);

    std::vector<std::string> results;
    auto it2 = std::back_inserter(results);
    redis.zrange("key", 0, -1, it2);
    printContainer(results);
}

void test2(sw::redis::Redis& redis)
{
    std::cout << "zcard" << std::endl;
    redis.flushall();

    redis.zadd("key", "吕布", 100);
    redis.zadd("key", "赵云", 99.5);
    redis.zadd("key", "关羽", 98);

    long long len = redis.zcard("key");
    std::cout << "len: " << len << std::endl;
}

void test3(sw::redis::Redis& redis)
{
    std::cout << "zrem" << std::endl;
    redis.flushall();

    redis.zadd("key", "吕布", 100);
    redis.zadd("key", "赵云", 99.5);
    redis.zadd("key", "关羽", 98);
    redis.zadd("key", "张飞", 97);
    redis.zadd("key", "典韦", 96);

    long long result = redis.zrem("key", "张飞");
    std::cout << "result: " << result << std::endl;

    result = redis.zrem("key", {"赵云", "吕布"});
    std::cout << "result: " << result << std::endl;

    std::vector<std::string> values = {
        "典韦", "关羽"
    };
    result = redis.zrem("key", values.begin(), values.end());
    std::cout << "result: " << result << std::endl;

    long long len = redis.zcard("key");
    std::cout << "len: " << len << std::endl;
}

void test4(sw::redis::Redis& redis)
{
    std::cout << "zscore" << std::endl;
    redis.flushall();

    redis.zadd("key", "吕布", 100);
    redis.zadd("key", "赵云", 99.5);
    redis.zadd("key", "关羽", 98);
    redis.zadd("key", "张飞", 97);
    redis.zadd("key", "典韦", 96);

    sw::redis::OptionalDouble result = redis.zscore("key", "赵云");
    if (result)
    {
        std::cout << "result: " << result.value() << std::endl;
    }
}

void test5(sw::redis::Redis& redis)
{
    std::cout << "zrank" << std::endl;
    redis.flushall();

    redis.zadd("key", "吕布", 100);
    redis.zadd("key", "赵云", 99.5);
    redis.zadd("key", "关羽", 98);
    redis.zadd("key", "张飞", 97);
    redis.zadd("key", "典韦", 96);

    sw::redis::OptionalLongLong result = redis.zrank("key", "关羽");
    if (result)
    {
        std::cout << "result: " << result.value() << std::endl;
    }
}

int main()
{
    sw::redis::Redis redis("tcp://127.0.0.1:6379");

    test1(redis);
    // test2(redis);
    // test3(redis);
    // test4(redis);
    // test5(redis);

    return 0;
}